SPSS EXECUTE 命令详解:何时使用以及为什么?

作者:Ruben Geert van den Berg,归属于 SPSS A-Z

EXECUTE 命令用于执行待处理的转换(pending transformations)。然而,许多 SPSS 用户并不清楚这到底意味着什么。更重要的是,你何时应该(不应该)运行 EXECUTE 命令?以及,在什么情况下你真正需要它?

让我们深入探讨一下。我们将使用 adratings.sav 数据集进行演示,该数据集的一部分如下图所示。

Data View SPSS Practice File Adratings.sav

SPSS 中的 “转换待处理” (Transformations Pending)

正如你可能已经了解到的,我们的数据包含了 18 位受访者对 3 个不同广告的评分。假设我们需要计算 ad1 的一个修正版本,我们将其命名为 cad1,方法是在每个分数上加 10 分。

一个简单的方法是使用 COMPUTE 命令,例如 compute cad1 = ad1 + 10.。如果你只运行这段 语法,你的数据视图将会如下图所示。

Transformations Pending in Data View After Running Transformation But Not EXECUTE

那么,状态栏中的 “转换待处理” 是什么意思?我的修正后的分数在哪里?我告诉 SPSS 计算它们,但它并没有执行!

然而,只需运行 execute. 就可以成功完成我们的转换。

为什么我们需要 EXECUTE?

基本上,我们在 SPSS 中所做的所有事情都是通过命令完成的。如果你直接从菜单操作,你可能看不到这些命令——正如 SPSS 语法 - 你应该使用它的六个理由 中解释的那样,这是一个灾难。

总而言之,SPSS 命令分为 3 种基本类型:

  • 过程 (procedures):是必须检查所有个案的命令。例如 FREQUENCIESDESCRIPTIVESSORT CASES,以及所有图表和统计检验。这些命令要求 SPSS 立即“遍历”所有个案。
  • 转换 (transformations):是会检查所有个案的命令,但只有在真正需要时才会执行。常见的转换包括 COMPUTERECODEIFSELECT IF
  • 其他命令 (other commands):不检查任何个案。例如 FILTERVARIABLE LABELSADD VALUE LABELS

如果你想知道一个命令是过程、转换还是其他类型,请查阅 所有 SPSS 命令概览

现在想象一下你是 SPSS——这并不难做到。你打开了一个包含 100,000 个个案的数据集。如果有人要求你 COMPUTE 一些东西,你必须遍历所有 100,000 个个案。这是一项相当大的工作!

然后,如果用户要求 FREQUENCIES,你必须再次遍历所有 100,000 个个案。因此,为了节省计算时间和电力,SPSS 倾向于只遍历所有个案一次,并一次性完成 COMPUTEFREQUENCIES。这就是为什么它不会立即执行某些命令——这些命令被称为转换命令。

SPSS 转换命令 (SPSS Transformation Commands)

现在,如果我们查阅关于 COMPUTE 的命令语法参考,我们会看到以下内容:

Command Syntax Reference on COMPUTE - An SPSS Tranformation COMPUTE 是一个转换命令

“它被存储,等待执行 (it is stored, pending)” 这句话表明 COMPUTE 是一个转换。这意味着如果我们想在继续之前在数据编辑器中查看结果,我们需要 EXECUTE 它。

SPSS 过程 (SPSS Procedures)

如果我们查找 FREQUENCIES,手册会告诉我们:

Command Syntax Reference on FREQUENCIES - An SPSS Procedure FREQUENCIES 是一个过程

一个“读取活动数据集 (reads the active dataset)”的命令是一个过程

这意味着在 FREQUENCIES 之前运行 EXECUTE 是没有意义的,只会减慢 SPSS 的速度。

同样,在 VARIABLE LABELSRENAME VARIABLES 之后运行 EXECUTE 也是没有意义的:这些不是转换,而是立即生效的,因此没有任何待处理的转换需要执行。

重要的是,一些转换数据的命令在技术上是过程,而不是转换。例如 ALTER TYPEAGGREGATERANK

Command Syntax Reference on RANK - An SPSS Procedure RANK 转换你的数据,但它是一个过程,而不是一个转换。

何时使用 EXECUTE?

  • 如果你有待处理的转换,并且想在执行其他操作之前直观地检查结果,请使用 EXECUTE
  • 在极少数情况下,你需要 EXECUTE 才能使你的语法正确运行。

那么,在什么情况下你真正需要 EXECUTE 呢?我熟悉 3 种情况,我将在下面介绍它们。同样,所有示例都使用 adratings.sav 数据集。

1. 在 DELETE VARIABLES 之前使用 EXECUTE

***错误的方法:计算总和并删除输入变量。
**
compute total = sum(ad1 to ad3).

delete variables ad1 to ad3.

***正确的方法:计算总和并删除输入变量。
**
compute total = sum(ad1 to ad3).
execute.

delete variables ad1 to ad3.

2. 在 LAG 函数之前使用 EXECUTE

***错误的方法:计算前一个案例的 ad1,然后在原始 ad1 上加 10。
**
compute prev_ad1 = lag(ad1).
compute ad1 = ad1 + 10.
execute.

***正确的方法:计算前一个案例的 ad1,然后在原始 ad1 上加 10。
**
compute prev_ad1 = lag(ad1).
execute.

compute ad1 = ad1 + 10.
execute.

3. 在使用 $Casenum 之后使用 EXECUTE

***错误的方法:删除前 10 个案例。
**
compute casenum = $casenum.
select if casenum > 10.
execute.

***正确的方法:删除前 10 个案例。
**
compute casenum = $casenum.
execute.

select if casenum > 10.
execute.